ELBでSSL Termination後の内部通信を暗号化する
SSL Terminationとは
ELBにSSL Terminationといって、ロードバランサー側でSSL認証を行ってくれる機能があります。WEBクライアントからSSL(443ポート)でリクエストが来ると、ELBがSSL証明書の確認をします。正しく処理されれば、ELB配下のEC2インスタンスに対して80ポートで通信を行います。
つい最近、このSSL Termination後のELBとEC2間の通信を改めて暗号化通信する方法ができましたのでご紹介します。
デモ用SSL証明書の作成
まずはデモ用にSSL証明書を作成します。詳しい説明は割愛しますが、証明書を作成する際に鍵の暗号化を外しています。本物を申請するときにはSSL会社の指示に従ってください。
$ openssl req -new -x509 -nodes -out server.crt -keyout server.key Generating a 1024 bit RSA private key ..................++++++++++++++ ........++++++++.........++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Shinjyuku-Ku Organization Name (eg, company) [Internet Widgits Pty Ltd]:Classmethod Organizational Unit Name (eg, section) []:Director Common Name (eg, YOUR name) []:Satoshi Email Address []:satoshi@example.com
どういった形式のものか確認をします。このテキストは後で貼付けます。
$ cat server.crt -----BEGIN CERTIFICATE----- MIIDojCCAwugAwIBAgIJALpicGZAg2xsMA0GCSqGSIb3DQEBBQUAMIGTMQswCQYD VQQGEwJKUDEOMAwGA1UECBMFVG9reW8xFTATBgNVBAcTDFNoaW5qeXVrdS1LdTEU MBIGA1UEChMLQ2xhc3NtZXRob2QxETAPBgNVBAsTCERpcmVjdG9yMRAwDgYDVQQD EwdTYXRvc2hpMSIwIAYJKoZIhvcNAQkBFhNzYXRvc2hpQGV4YW1wbGUuY29tMB4X DTExMTAyNjE3MjYxNVoXDTExMTEyNTE3MjYxNVowgZMxCzAJBgNVBAYTAkpQMQ4w DAYDVQQIEwVUb2t5bzEVMlkzmshlfaihxlasiuehmxfaesfasxfMnOC501qDKv9R mcaemiuahecmfiuhscmfihszdfciuhsdlfczsmhflIUHjxKCvkBbRMg221qXBWzr Fcqgz2CFFKPCbGSD8eAagVZCjMoBQQzF4wcaqfjQYK3IhD4Z7EAhmRxELESZM30n clNdyfty29wN60ZjTupZJtJBRPzXIH4tqX8UcBuME0Wuqb8dduHoosboMdoIz4NX AgMBAAGjgfswgfgwHQYDVR0OBBYEFIakyhKRDi2UpjmPQoE1vBLw6sXLMIHIBgNV HSMEgcAwgb2AFIakyhKRDi2UpjmPQoE1vBLw6sXLoYGZpIGWMIGTMQswCQYDVQQG EwJKUDEOMAwGA1UECBMFVG9reW8xFTATBgNVBAcTDFNoaW5qeXVrdS1LdTEUMBIG A1UEChMLQ2xhc3NtZXRob2QxETAPBgNVBAsTCERpcmVjdG9yMRAwDgYDVQQDEwdT YXRvc2hpMSIwIAYJKoZIhvcNAQkBFhNzYXRvc2hpQGV4YW1wbGUuY29tggkAumJw ZkCDbGwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBjYK7t7/e6IUgo /pNVEXRVb3R8pA5S0vy+cBGn49Rs4N1Y0EhZk2tUg0dzKGNBfeCYip2H0DcNCKIf 3KC7O9Z/pu7Koa9Ej1a+9G/9J8hlHcpQuKr6vhkB0KkkxaU4/LiSaBoXivWuydAn BCDQK2TkCgSDzAhtJIp8t9GDStuP+Q== -----END CERTIFICATE-----
こちらは同時に生成されたプライベートキーです。
$ cat server.key -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDrhWzuIts+DJzgudNagyr/UY8Sgr5AW0TINttalwVs6xXKoM9g hRSjwmxkg/HgGoFWQozKAUEMxeMHGqn40GCtyIQ+GexAIZkcRCxEmTN9J3JTXcn7 ctvcDetGY07qWSbSQUT81yB+Lal/FHAbjBNFrqm/HXbh6KLG6DHaCM+DVwIDAQAB AoGAdOg3CQHuWIUNHUMHLKDUGLMIUWHMXIUHET3shkwemlEa8Qjfx2Znt13j1gUU xAwEFWBVaFQ1CPUVW0pmAqbUxZrTNdykuz5gkgR7Q3RAjsAEuTQnqDLuKxScPc1S CdB4zn4NpO2m+keNc0L3sg3aTeGR+QHV8qBgldcktqqv46kCQQD3GNy/gYIXalEI QpqhFM56iCPGxcTauLTfzXY8jBp4ZtWsQeUKVz8tcOIUyQ7xzaCRjB+mW54hnf/V 8Y3Rl8/DAkEA9AHKeVjTFvDJotmyiPLRdCgl30REfK+XL/KPPXMkF6hpAAj6vGEO ONf+eUxeqRxnSOL1sSTQiP2BK12xBQ+43QJBAINc01Z4Kkn6enPSvNPv9MlNgP+W ek3xLi9g0n/j19q0iNnXMCWHHR!LWAKMHFLWUHWHMIFHLIUHFkUp8sQ/WfMCQA9O WXQZNUyYGB3mCAP9L1RY/F8v+hfUL+irD38sTNRLFSMSbSAJ+oloSycyujFjfbsd uYm+JHKjbEnbG7KUlOUCQQDZ5D6pBmWwrR6QxlRt+L4g2qcHZfpPCJY5Gbo5jxeK RcXyK+JhFYThcRtKkfhs32/MolDx2Dthj9YtSwfWWb63 -----END RSA PRIVATE KEY-----
Management ConsoleからELBを生成する
ELBの作成プロセスにおいて、SSLを設定するとSSL Terminationの設定を行う事ができます。また、SSLからSSLといった転送を選択した場合には、ELBとEC2間の通信暗号化について設定を行うことができます。
443ポートを設定したのでSSL Terminationの設定について聞かれます。opensslで作成した鍵のテキストを貼付けましょう。
次に、暗号アルゴリズムとハッシュアルゴリズムの組み合わせについて選択します。
そして、ELBとEC2間の暗号化について聞かれますので、必要に応じて証明書を記述します。
最後に、ロードバランサーの設定をします。
ELB配下に置くEC2インスタンスを登録します。
最後の最後の確認が出て、問題なければCreateボタンを押して作成完了です。
まとめ
ELBのSSL Terminationは待望の機能でしたが、さらに応用としてELBとEC2の通信を暗号化することもできるようになりました。普通のプログラマーにとってロードバランサーを実際に触りながら理解を深める機会はなかなか無いかと思います。ELBを活用してロードバランサーマエストロになっちゃいましょう!